//
//  CZStatusViewModel.swift
//  WeiBo
//
//  Created by Apple on 16/9/6.
//  Copyright © 2016年 KY. All rights reserved.
//

import UIKit
import YYText
//  处理微博数据的ViewModel
class CZStatusViewModel: NSObject {

    //  持有的微博模型
    var status: CZStatus?
    
    //  转发数内容
    var retweetCountContent: String?
    //  评论数内容
    var commentCountContent: String?
    //  赞数内容
    var unlikeCountContent: String?
    
    //  认证类型等级图片
    var verifiedTypeImage: UIImage?
    //  会员等级图片
    var mbrankImage: UIImage?
    //  处理转发微博内容
    var retweetContent: String?
    //  来源
    var sourceContent: String?
    //  时间
    /* 
        时间字符串显示的逻辑处理
            如果是今年
                是否是今天
                    是否是1分钟之内
                        刚刚
                    是否是1小时之内
                        xx分钟前
                    其它
                        xx小时前
                是否是昨天
                  - 昨天 10:10
                其它
                  - 09-06 10:10
            不是今年
                - 2015-09-08 10:10
     
     */
    var timeContent: String?  {
        //  判断时间字符串是否为nil
        guard let createAt = status?.created_at else {
            return nil
        }
        
        return Date.sinaDate(createAt: createAt).sinaDateString
        
//        //  代码执行到此，发微博时间不为空
//        let dt = DateFormatter()
//        //  指定本地化信息
//        dt.locale = Locale(identifier: "en_US")
//        dt.dateFormat = "EEE MMM dd HH:mm:ss z yyyy"
//        let createDate = dt.date(from: createAt)!
//    
//        if isThisYear(createDate: createDate) {
//            
//            //  通过日历对象判断
//            let calendar = Calendar.current
//            if calendar.isDateInToday(createDate) {
//                //  今天
//                let timeInterval = abs(createDate.timeIntervalSinceNow)
//                if timeInterval < 60 {
//                    //  1分钟之内
//                    return "刚刚"
//                } else if timeInterval < 3600 {
//                    //  1小时之内
//                    let result = Int(timeInterval) / 60
//                    return "\(result)分钟前"
//                } else {
//                    //  xx小时前
//                    let result = Int(timeInterval) / 3600
//                    return "\(result)小时前"
//                }
//                
//                
//            } else if calendar.isDateInYesterday(createDate) {
//                //  昨天
//                dt.dateFormat = "昨天 HH:mm"
//            } else {
//                //  其它
//                dt.dateFormat = "MM-dd HH:mm"
//            }
//            
//            
//        } else {
//            dt.dateFormat = "yyyy-MM-dd HH:mm"
//        }
//        
//        
//        return dt.string(from: createDate)
    
    }
    
    //  原创微博富文本
    var originalAttributedString: NSAttributedString?
    //  转发微博富文本
    var retweetAttributedString: NSAttributedString?
    
    //  通过微博模型构造ViewModel对象
    init(status: CZStatus) {
        super.init()
        self.status = status
        //  设置转发数内容
        retweetCountContent = handleCountContent(count: status.reposts_count, defaultTitle: "转发")
        //  评论数内容
        commentCountContent = handleCountContent(count: status.comments_count, defaultTitle: "评论")
        //  赞数内容
        unlikeCountContent = handleCountContent(count: status.attitudes_count, defaultTitle: "赞")
        
        //  处理认证类型等级图片
        handleVerifiedTypeImage(verifiedType: status.user?.verified_type ?? 0)
        //  处理会员等级图片
        handleMbrankImage(mbrank: status.user?.mbrank ?? 0)
        //  处理转发微博内容
        handleRetweetContent(status: status)
        //  处理来源数据内容
        handleSourceContent(source: status.source ?? "")
        print(timeContent)
        
        
        originalAttributedString = handleStatusAttributed(status: status.text!)
    }
    
    
    //  处理微博富文本
    private func handleStatusAttributed(status: String) -> NSAttributedString {
    
        //  把微博内容转成微博富文本
        let result = NSMutableAttributedString(string: status)
        var matchResultArray = [CZMatchResult]()
        //  匹配微博内容的表情描述
       
        (status as NSString).enumerateStringsMatched(byRegex: "\\[[a-zA-Z0-9\\u4e00-\\u9fa5]+\\]") { (matchCount, matchStr, matchRange, _) in
            
            print(matchStr?.pointee)
            
            //  memory改成了pointee
            if let chs = matchStr?.pointee as? String {

                //  正向替换有问题，记录匹配的结果倒序替换
//                //  表情描述不为空，在本地查找对应的表情模型
//                if let emoticon = CZEmoticonTools.shareTools.findEmotion(chs: matchString as String) {
//                    
//                    //  通过表情模型生成对应的富文本
//                    
//                    let attributedStr = NSAttributedString.attributedStringWithEmoticon(emoticon: emoticon, font: UIFont.systemFont(ofSize: 14))
//                    
//                    //  替换富文本
//                    result.replaceCharacters(in: matchRange?.pointee, with: attributedStr)
//                    
//                }
                
                
                let matchResult = CZMatchResult(matchString: chs, matchRange: matchRange!.pointee)
                matchResultArray.append(matchResult)
                
                
            }
            
            
        }
        
        
        //  倒序替换
        for value in matchResultArray.reversed() {
            print(value.matchString)
            //  表情描述不为空，在本地查找对应的表情模型
            if let emoticon = CZEmoticonTools.shareTools.findEmotion(chs: value.matchString) {

                //  通过表情模型生成对应的富文本

//                let attributedStr = NSAttributedString.attributedStringWithEmoticon(emoticon: emoticon, font: UIFont.systemFont(ofSize: 14))
                let image = UIImage(named: emoticon.path!)
                let attributedStr = NSMutableAttributedString.yy_attachmentString(withContent: image, contentMode: .scaleAspectFit, attachmentSize: CGSize(width: 13, height: 13), alignTo: UIFont.systemFont(ofSize: 13), alignment: .center)

                //  替换富文本
                result.replaceCharacters(in: value.matchRange, with: attributedStr)
                
            }
        }
        
        
        //  设置富文本文字大小
        result.addAttribute(NSFontAttributeName, value: UIFont.systemFont(ofSize: 13), range: NSMakeRange(0, result.length))
        
        //  设置文字颜色
        result.addAttribute(NSForegroundColorAttributeName, value: UIColor.gray, range: NSMakeRange(0, result.length))
        
        addLinkColor(statusAttributed: result, regex: "@[^\\W]+")
        addLinkColor(statusAttributed: result, regex: "http://[^\\s\\u4e00-\\u9fa5]+")
        addLinkColor(statusAttributed: result, regex: "#[^#]+#")
        
        
        
        
        
        
        return result
    }
    
    
    //  根据正则表达式匹配链接结果
    private func addLinkColor(statusAttributed: NSMutableAttributedString, regex: String) {
        
        
        (statusAttributed.string as NSString).enumerateStringsMatched(byRegex: regex) { (matchCount, matchStr, matchRange, _) in
            
            let color = UIColor(red: 80 / 255, green: 125 / 255, blue: 215 / 255, alpha: 1)
            //给属性文本对应的range 添加前景色的属性
            statusAttributed.addAttribute(NSForegroundColorAttributeName, value: color, range: matchRange!.pointee)
            
            let backgroundColor = UIColor(red: 177 / 255, green: 215 / 255, blue: 255 / 255, alpha: 1)
            let border = YYTextBorder(fill: backgroundColor, cornerRadius: 3)
            //  设置border在其label的内容间距
            border.insets = UIEdgeInsets(top: 1, left: 0, bottom: 0, right: 0)
            
            let highlight = YYTextHighlight()
            //设置文本在高亮状态下的 颜色(r: 80, g: 125, b: 175)
            
            highlight.setColor(color)
            //设置文本在高亮状态下的 颜色
            highlight.setBackgroundBorder(border)
            //  设置指定范围的高亮效果
            statusAttributed.yy_setTextHighlight(highlight, range: matchRange!.pointee)
            
            
        }
    
    }
    
    
    
//    //  判断是否是今年
//    private func isThisYear(createDate: Date) -> Bool {
//        
//        let dt = DateFormatter()
//        dt.locale = Locale(identifier: "en_US")
//        dt.dateFormat = "yyyy"
//        let createYear = dt.string(from: createDate)
//        let currentYear = dt.string(from: Date())
//
//        return createYear == currentYear
//    }
    
    
    
    //  来源数据
    private func handleSourceContent(source: String) {
//        <a href="http://app.weibo.com/t/feed/6vtZb0" rel="nofollow">微博 weibo.com</a>
        if source.contains("\">") && source.contains("</") {
            
            //  判断范围
            if let startRange = source.range(of: "\">"), let endRange = source.range(of: "</") {
                //  获取最后的光标索引位置
                let startIndex = startRange.upperBound
                //  获取开始的光标索引位置
                let endIndex = endRange.lowerBound
                //  根据范围截取
                sourceContent = "来自:" + source.substring(with: startIndex..<endIndex)
                
            }
            
            
        }
    }
    
    //  处理转发微博内容
    private func handleRetweetContent(status: CZStatus) {
        if let retweetStatus = status.retweeted_status {
            if let text = retweetStatus.text, let name = retweetStatus.user?.screen_name {
                let result = "@\(name): \(text)"
                retweetContent = result
                //  处理转发微博富文本
                retweetAttributedString = handleStatusAttributed(status: retweetContent!)
            }
            
            
        }
    }
    
    //  根据会员等级处理显示的相应的图片
    private func handleMbrankImage(mbrank: Int) {
        if mbrank >= 1 && mbrank <= 6 {
            mbrankImage = UIImage(named: "common_icon_membership_level\(mbrank)")
        }
        
        
    }
    
    //  根据认证类型等级处理显示对应的认证类型等级的图片
    private func handleVerifiedTypeImage(verifiedType: Int) {
        //  认证类型等级 -1 没有认证 ，0 认证用户，2，3，5 企业认证 ， 220 达人
        switch verifiedType {
        case 0:
            verifiedTypeImage = UIImage(named: "avatar_vip")
        case 2, 3, 5:
            verifiedTypeImage = UIImage(named: "avatar_enterprise_vip")
        case 220:
            verifiedTypeImage = UIImage(named: "avatar_grassroot")
        default:
            verifiedTypeImage = nil
        }
        
    }
    
    
    //  根据转发、评论、赞数量处理显示内容
    private func handleCountContent(count: Int, defaultTitle: String) -> String {
        if count > 0 {
            if count >= 10000 {
                //  先除以1000，保证十位数，然后在转成float再除以10计算显示的结果
                let result = Float(count / 1000) / 10
                var resultStr = "\(result)万"
                //  判断是否包含.0,有替换成功空字符串
                if resultStr.contains(".0") {
                    resultStr = resultStr.replacingOccurrences(of: ".0", with: "")
                }
                return resultStr
                
            } else {
                return "\(count)"
            }
            
            
        } else {
            return defaultTitle
        }
    }
    
    
}
